/*
 * @功能描述: 
 * @版本: v1.0.0
 * @作者: LuAn
 * @Date: 2021-08-30 19:59:29
 * @LastEditTime: 2021-09-03 05:41:27
 */
#ifndef _BSP_GPIO_H
#define _BSP_GPIO_H
#include "imx6ul.h"
#define BSP_GPIO_PIN(N) (1UL << (N))
#define BSP_GPIO_PIN_0 (1UL << 0)
#define BSP_GPIO_PIN_1 (1UL << 1)
#define BSP_GPIO_PIN_2 (1UL << 2)
#define BSP_GPIO_PIN_3 (1UL << 3)
#define BSP_GPIO_PIN_4 (1UL << 4)
#define BSP_GPIO_PIN_5 (1UL << 5)
#define BSP_GPIO_PIN_6 (1UL << 6)
#define BSP_GPIO_PIN_7 (1UL << 7)
#define BSP_GPIO_PIN_8 (1UL << 8)
#define BSP_GPIO_PIN_9 (1UL << 9)
#define BSP_GPIO_PIN_10 (1UL << 10)
#define BSP_GPIO_PIN_11 (1UL << 11)
#define BSP_GPIO_PIN_12 (1UL << 12)
#define BSP_GPIO_PIN_13 (1UL << 13)
#define BSP_GPIO_PIN_14 (1UL << 14)
#define BSP_GPIO_PIN_15 (1UL << 15)
#define BSP_GPIO_PIN_16 (1UL << 16)
#define BSP_GPIO_PIN_17 (1UL << 17)
#define BSP_GPIO_PIN_18 (1UL << 18)
#define BSP_GPIO_PIN_19 (1UL << 19)
#define BSP_GPIO_PIN_20 (1UL << 20)
#define BSP_GPIO_PIN_21 (1UL << 21)
#define BSP_GPIO_PIN_22 (1UL << 22)
#define BSP_GPIO_PIN_23 (1UL << 23)
#define BSP_GPIO_PIN_24 (1UL << 24)
#define BSP_GPIO_PIN_25 (1UL << 25)
#define BSP_GPIO_PIN_26 (1UL << 26)
#define BSP_GPIO_PIN_27 (1UL << 27)
#define BSP_GPIO_PIN_28 (1UL << 28)
#define BSP_GPIO_PIN_29 (1UL << 29)
#define BSP_GPIO_PIN_30 (1UL << 30)
#define BSP_GPIO_PIN_31 (1UL << 31)

#define BSP_GPIO_PIN_OUT_LOW 0
#define BSP_GPIO_PIN_OUT_HIG 1

/* 枚举类型和结构体定义 */
typedef enum _gpio_pin_direction
{
  kGPIO_DigitalInput = 0U,  /* 输入 */
  kGPIO_DigitalOutput = 1U, /* 输出 */
} gpio_pin_direction_t;
typedef enum _gpio_interrupt_mode
{
  kGPIO_IntLowLevel = 0UL, // 低电平
  kGPIO_IntHigLevel,       // 高电平
  kGPIO_IntRisEdge,        // 上升沿
  kGPIO_IntFalEdge,        // 下降沿
  kGPIO_IntEdge,           // 边沿触发
  kGPIO_NoIntmode,
} gpio_interrupt_mode_t;
typedef struct _gpio_pin_config
{
  gpio_pin_direction_t direction; /* GPIO方向:输入还是输出 */
  uint8_t outputLogic;            /* 如果是输出的话，默认输出电平 */
} gpio_pin_config_t;

void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
int gpio_pinread(GPIO_Type *base, int pin);
void gpio_pinwrite(GPIO_Type *base, int pin, int value);

void gpio_init_output(GPIO_Type *base, int pin, int val);
void gpio_init_input(GPIO_Type *base, int pin);
void gpio_init_pins_input(GPIO_Type *base, uint32_t pins);
void gpio_init_pins_output(GPIO_Type *base, uint32_t pins);
void gpio_clr_pins(GPIO_Type *base, uint32_t pins);
void gpio_set_pins(GPIO_Type *base, uint32_t pins);
// 读取gpio数据
#define gpio_reads(base) (base->DR)

void gpio_int_init(GPIO_Type *base, uint32_t pin, gpio_interrupt_mode_t mode);
void gpio_ints_enable(GPIO_Type *base, uint32_t pins);
void gpio_ints_disable(GPIO_Type *base, uint32_t pins);
void gpio_pins_int_init(GPIO_Type *base, uint32_t pins, ...);
void gpio_clr_ints(GPIO_Type *base, uint32_t pins);
void io_pin_config(uint32_t muxRegister,
                   uint32_t muxMode,
                   uint32_t inputRegister,
                   uint32_t inputDaisy,
                   uint32_t configRegister,
                   uint32_t inputOnfield,
                   uint32_t configValue);
#endif
